package cn.hn.java.summer.db;

import java.util.List;

import javax.sql.DataSource;

import cn.hn.java.summer.exception.SnException;

/**
 * 自定义jdbcTemplate接口，定义常用操作
 * @author sjg
 * @version 1.0.1 2013-10-22
 *
 */
public interface ISnJdbcTemplate {
	
	/**
	 * 获取数据源
	 * @return
	 */
	public DataSource getDataSource();
	
	/**
	 * 设置数据源
	 * @param ds
	 */
	public void setDataSource(DataSource ds);
	
	/**
	 * 取列表
	 * @param <T>
	 * @param sql
	 * @param elementType  
	 * 列表元素类型，对于单列可选值为:String.class、int.class、float.class、double.class和long.class<br/>
	 * 对于多列，该值为实体bean类，字段名与属性名对应
	 * @param args
	 * 可以是包含参数的对象，也可以是单个参数列
	 * @return
	 */
	public <T> List<T> list(String sql,Class<T> elementType, Object...args);
	
	/**
	 * 批量取列表
	 * 如：要同时跨多个表查询时，sql除表名外其它都一样，这样就可以把多个查询合并到一起查询(union all)，提供批量的查询参数args
	 * @param sql sql语句或id
	 * @param elementType 返回值类型
	 * @param args 批量参数
	 */
	public <T> List<T> list(String sql,Class<T> elementType, List<Object[]> args);
	
	/**
	 * 强制取所有数据不分页的方法
	 * @param <T>
	 * @param sql
	 * @param elementType
	 * @param args
	 * @return
	 */
	public <T> List<T> all(String sql,Class<T> elementType, Object...args);

	
	/**
	 * 查询单个对象值
	 * @param <T>
	 * @param type
	 * @param sql
	 * @param args
	 * @return
	 */
	public <T> T get(String sql, Class<T> type, Object... args);
			
	
	//==========================================================================================
	
	/**
	 * 执行sql
	 */
	public void execute(String sql) ;

	/**
	 * 执行更新、插入、删除操作
	 * @param sql
	 * @param args 参数
	 * @return
	 */
	public int update(String sql, Object... args) ;
	
	/**
	 * 批量更新、插入、删除操作
	 * @param <T>
	 * @param sql
	 * @param batchArgs
	 * @param mapper
	 * @return
	 */
	@SuppressWarnings("rawtypes")
	public <T> int[] batchUpdate(String sql, List<T> batchArgs,IBatchArgMapper mapper) throws SnException;
}
